跳到主要内容

数据表的外键

正如我们在视图系统中所介绍的那样,在实际的情况中,关系型数据库的查询,可以让我们对分散于不同数据表的数据进行整合与引用,在本篇文章中,我们将对数据表的外键进行介绍,它是在数据表本身的结构上下功夫的一种手段。

外键又被称呼为引用,其基本的使用方法如下:

CREATE TABLE /* 表名 */ (
/* 列 */ references /* 目标数据表 */ (/* 某列 */), /* 供应厂商的 ID */
/* ... */
);

现在让我们尝试假定一个场景,现在假定我们正在展开一次设备采购,为了保证质量,采购方面的人员希望我们能够根据一份可信名单,选择厂商展开这一次工作,可信名单表参考如下:

CREATE TABLE trusted_vendors (
name TEXT, /* 厂商的名称 */
usci TEXT UNIQUE /* 厂商的统一信用代码 */
);
提示

使用 UNIQUE 可以确保数据表某列的唯一性
为某列加上 UNIQUE 约束, 可以促使 PostgreSQL 在插入数据时,对数据展开一个检查,查看其是否已经在数据表中存在,将会引发数据重复的数据插入将会被拒绝。
约束在促进数据合规的同时,往往也会降低数据写入的效率,因此我们需要找到平衡点来加以把握。

然后,我们可以设立一张采购记录表,用以描述我们所做出来的采购选择,用于登记报备:

CREATE TABLE orders (
vendor TEXT references trusted_vendors (usci), /* 供应厂商的 ID */
buyer TEXT, /* 负责采购的人员 */
purchase_quantity INTEGER, /* 采购数量(箱) */
record_time DATE /* 订单生效的时间 */
);
提示

最好使用 ID 而不是名称来标识用户、厂商等
只需要增加 ID 的长度以及设定好构建的算法(结合时间),我们可以非常轻易地规避 ID 重复的问题,而名称则显然非常难以做到这一点(而且很多时候,用户名的变更,厂商名称的变更都是非常常见的事情,如果选择他们用于标识记录,那么一旦展开修订,势必带来很多额外的负担)。

让我们尝试插入一些数据:

INSERT INTO trusted_vendors VALUES ('娃哈哈', '91330000142916567N');
INSERT INTO trusted_vendors VALUES ('农夫山泉', '91330000143995391Q');
INSERT INTO trusted_vendors VALUES ('百岁山', '91361022MADMDA324Y');
INSERT INTO trusted_vendors VALUES ('华润怡宝', '91440300192441045W');

之后,让我们来做一些采购工作:

/* 购买一百箱怡宝矿泉水, 信用代码在可信名单内, 顺利完成 */
INSERT INTO orders VALUES ('91440300192441045W', '文一', 100, '2024-6-1');
/* Opps! 信用代码不在可信名单内(此处我找了一个已经被吊销的“老赖”企业的信用代码,哈哈哈哈), 检查不通过 */
INSERT INTO orders VALUES ('913608297814823045', '文一', 10, '2024-6-8');

这样,我们就对于外键的应用,有了一个基本的了解,适当的使用外键可以促进我们的工作,但是因为它涉及多表的数据查询,因此常常会降低性能,这又是一件值得我们思考的事情。